home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / archiver / arc.zoo / marc.c < prev    next >
C/C++ Source or Header  |  1989-01-29  |  9KB  |  331 lines

  1. /*
  2.  * $Header: marc.c,v 1.5 88/08/01 14:19:19 hyc Exp $
  3.  */
  4.  
  5. /*  MARC - Archive merge utility
  6.  
  7.     Version 5.21, created on 04/22/87 at 15:05:10
  8.  
  9. (C) COPYRIGHT 1985-87 by System Enhancement Associates; ALL RIGHTS RESERVED
  10.  
  11.     By:     Thom Henderson
  12.  
  13.     Description:
  14.      This program is used to "merge" archives.  That is, to move
  15.      files from one archive to another with no data conversion.
  16.      Please refer to the ARC source for a description of archives
  17.      and archive formats.
  18.  
  19.     Instructions:
  20.      Run this program with no arguments for complete instructions.
  21.  
  22.     Language:
  23.      Computer Innovations Optimizing C86
  24. */
  25. #include <stdio.h>
  26. #include "arc.h"
  27.  
  28. #if    UNIX
  29. #include <sys/types.h>
  30. #include <sys/stat.h>
  31. #endif
  32.  
  33. FILE *src;                   /* source archive */
  34. char srcname[STRLEN];               /* source archive name */
  35.  
  36. static char **lst;               /* files list */
  37. static int lnum;               /* length of files list */
  38.  
  39.  
  40. main(nargs,arg)                   /* system entry point */
  41. int nargs;                   /* number of arguments */
  42. char *arg[];                   /* pointers to arguments */
  43. {
  44.     char *makefnam();               /* filename fixup routine */
  45. #ifndef __STDC__
  46.     char *calloc();               /* memory manager */
  47.     char *envfind();
  48. #endif
  49. #if    !MTS
  50.     char *arctemp2;
  51. #ifndef __STDC__
  52.     char *mktemp();        /* temp file stuff */
  53. #endif
  54. #endif
  55. #if    GEMDOS
  56.     void exitpause();
  57. #endif
  58.     int n;                   /* index */
  59. #if    UNIX
  60.     struct    stat    sbuf;
  61. #endif
  62.  
  63.  
  64.     if(nargs<3)
  65.     {     printf("MARC - Archive merger, Version 5.21, created on 04/22/87 at 15:05:10\n");
  66. /*     printf("(C) COPYRIGHT 1985,86,87 by System Enhancement Associates;");
  67.      printf(" ALL RIGHTS RESERVED\n\n");
  68.      printf("Please refer all inquiries to:\n\n");
  69.      printf("    System Enhancement Associates\n");
  70.      printf("    21 New Street, Wayne NJ 07470\n\n");
  71.      printf("You may copy and distribute this program freely,");
  72.      printf(" provided that:\n");
  73.      printf("    1)      No fee is charged for such copying and");
  74.      printf(" distribution, and\n");
  75.      printf("    2)      It is distributed ONLY in its original,");
  76.      printf(" unmodified state.\n\n");
  77.      printf("If you like this program, and find it of use, then your");
  78.      printf(" contribution will\n");
  79.      printf("be appreciated.  You may not use this product in a");
  80.      printf(" commercial environment\n");
  81.      printf("or a governmental organization without paying a license");
  82.      printf(" fee of $35.  Site\n");
  83.      printf("licenses and commercial distribution licenses are");
  84.      printf(" available.  A program\n");
  85.      printf("disk and printed documentation are available for $50.\n");
  86.      printf("\nIf you fail to abide by the terms of this license, ");
  87.      printf(" then your conscience\n");
  88.      printf("will haunt you for the rest of your life.\n\n");
  89. */
  90.      printf("Usage: MARC <tgtarc> <srcarc> [<filename> . . .]\n");
  91.      printf("Where: <tgtarc> is the archive to add files to,\n");
  92.      printf("    <srcarc> is the archive to get files from, and\n");
  93.      printf("    <filename> is zero or more file names to get.\n");
  94.      printf("\nAdapted from MSDOS by Howard Chu\n");
  95. #if    GEMDOS
  96.      exitpause();
  97. #endif
  98.      return 1;
  99.     }
  100.  
  101.     /* see where temp files go */
  102. #if    !MTS
  103.     arctemp = calloc(1, STRLEN);
  104.     if (!(arctemp2 = envfind("ARCTEMP")))
  105.         arctemp2 = envfind("TMPDIR");
  106.     if (arctemp2) {
  107.         strcpy(arctemp, arctemp2);
  108.         n = strlen(arctemp);
  109.         if (arctemp[n - 1] != CUTOFF)
  110.             arctemp[n] = CUTOFF;
  111.     }
  112. #if    UNIX
  113.     else    strcpy(arctemp, "/tmp/");
  114. #endif
  115. #if    !MSDOS
  116.     {
  117.         static char tempname[] = "AXXXXXX";
  118.         strcat(arctemp, mktemp(tempname));
  119.     }
  120. #else
  121.     strcat(arctemp, "$ARCTEMP");
  122. #endif
  123. #else
  124.     guinfo("SHFSEP    ", gotinf);
  125.     sepchr[0] = gotinf[0];
  126.     guinfo("SCRFCHAR", gotinf);
  127.     tmpchr[0] = gotinf[0];
  128.     arctemp = "-$$$";
  129.     arctemp[0] = tmpchr[0];
  130. #endif
  131.  
  132. #if    UNIX
  133.     if (!stat(arg[1],&sbuf))
  134.         strcpy(arcname,arg[1]);
  135.     else
  136.         makefnam(arg[1],".arc",arcname);
  137.     if (!stat(arg[2],&sbuf))
  138.         strcpy(srcname,arg[2]);
  139.     else
  140.         makefnam(arg[2],".arc",srcname);
  141. #else
  142.     makefnam(arg[1],".ARC",arcname);   /* fix up archive names */
  143.     makefnam(arg[2],".ARC",srcname);
  144. /*    makefnam(".$$$",arcname,newname);*/
  145.     sprintf(newname,"%s.arc",arctemp);
  146. #endif
  147.  
  148.     arc = fopen(arcname,OPEN_R);           /* open the archives */
  149.     if(!(src=fopen(srcname,OPEN_R)))
  150.      abort("Cannot read source archive %s",srcname);
  151.     if(!(new=fopen(newname,OPEN_W)))
  152.      abort("Cannot create new archive %s",newname);
  153.  
  154.     if(!arc)
  155.      printf("Creating new archive %s\n",arcname);
  156.  
  157.     /* get the files list set up */
  158.  
  159.     lnum = nargs-3;               /* initial length of list */
  160.     if(lnum<1)                   /* phoney for default case */
  161.     {     lnum = 1;
  162.      lst = (char **) calloc(1,sizeof(char *));
  163.      lst[0] = "*.*";
  164.     }
  165.     else                   /* else use filenames given */
  166.     {     lst = (char **) calloc(lnum,sizeof(char *));
  167.      for(n=3; n<nargs; n++)
  168.           lst[n-3] = arg[n];
  169.  
  170.      for(n=0; n<lnum; )           /* expand indirect references */
  171.      {    if(*lst[n] == '@')
  172.            expandlst(n);
  173.           else n++;
  174.      }
  175.     }
  176.  
  177.     merge(lnum,lst);               /* merge desired files */
  178.  
  179.     if(arc) fclose(arc);           /* close the archives */
  180.     fclose(src);
  181.     fclose(new);
  182.  
  183.     if(arc)                   /* make the switch */
  184.      if(unlink(arcname))
  185.           abort("Unable to delete old copy of %s",arcname);
  186.     if(move(newname,arcname))
  187.      abort("Unable to rename %s to %s",newname,arcname);
  188.  
  189.     setstamp(arcname,arcdate,arctime);     /* new arc matches newest file */
  190.  
  191. #if    GEMDOS
  192.     exitpause();
  193. #endif
  194.     return nerrs;
  195. }
  196.  
  197. merge(nargs,arg)               /* merge two archives */
  198. int nargs;                   /* number of filename templates */
  199. char *arg[];                   /* pointers to names */
  200. {
  201.     struct heads srch;               /* source archive header */
  202.     struct heads arch;               /* target archive header */
  203.     int gotsrc, gotarc;               /* archive entry versions (0=end) */
  204.     int copy;                   /* true to copy file from source */
  205.     int n;                   /* index */
  206.  
  207.     gotsrc = gethdr(src,&srch);           /* get first source file */
  208.     gotarc = gethdr(arc,&arch);           /* get first target file */
  209.  
  210.     while(gotsrc || gotarc)           /* while more to merge */
  211.     {     if(strcmp(srch.name,arch.name)>0)
  212.      {    copyfile(arc,&arch,gotarc);
  213.           gotarc = gethdr(arc,&arch);
  214.      }
  215.  
  216.      else if(strcmp(srch.name,arch.name)<0)
  217.      {    copy = 0;
  218.           for(n=0; n<nargs; n++)
  219.           {       if(match(srch.name,arg[n]))
  220.            {    copy = 1;
  221.             break;
  222.            }
  223.           }
  224.           if(copy)               /* select source or target */
  225.           {       printf("Adding file:      %s\n",srch.name);
  226.            copyfile(src,&srch,gotsrc);
  227.           }
  228.           else fseek(src,srch.size,1);
  229.           gotsrc = gethdr(src,&srch);
  230.      }
  231.  
  232.      else                   /* duplicate names */
  233.      {    copy = 0;
  234.           {       if((srch.date>arch.date)
  235.            || (srch.date==arch.date && srch.time>arch.time))
  236.            {    for(n=0; n<nargs; n++)
  237.             {    if(match(srch.name,arg[n]))
  238.                  {      copy = 1;
  239.                   break;
  240.                  }
  241.             }
  242.            }
  243.           }
  244.           if(copy)               /* select source or target */
  245.           {       printf("Updating file: %s\n",srch.name);
  246.            copyfile(src,&srch,gotsrc);
  247.            gotsrc = gethdr(src,&srch);
  248.            if(gotarc)
  249.            {    fseek(arc,arch.size,1);
  250.             gotarc = gethdr(arc,&arch);
  251.            }
  252.           }
  253.           else
  254.           {       copyfile(arc,&arch,gotarc);
  255.            gotarc = gethdr(arc,&arch);
  256.            if(gotsrc)
  257.            {    fseek(src,srch.size,1);
  258.             gotsrc = gethdr(src,&srch);
  259.            }
  260.           }
  261.      }
  262.     }
  263.  
  264.     hdrver = 0;                   /* end of archive marker */
  265.     writehdr(&arch,new);           /* mark the end of the archive */
  266. }
  267.  
  268. int gethdr(f,hdr)               /* special read header for merge */
  269. FILE *f;                   /* file to read from */
  270. struct heads *hdr;               /* storage for header */
  271. {
  272.     char *i = hdr->name;           /* string index */
  273.     int n;                   /* index */
  274.  
  275.     for(n=0; n<FNLEN; n++)           /* fill name field */
  276.      *i++ = 0176;               /* impossible high value */
  277.     *--i = '\0';               /* properly end the name */
  278.  
  279.     hdrver = 0;                   /* reset header version */
  280.     if(readhdr(hdr,f))               /* use normal reading logic */
  281.      return hdrver;               /* return the version */
  282.     else return 0;               /* or fake end of archive */
  283. }
  284.  
  285. copyfile(f,hdr,ver)               /* copy a file from an archive */
  286. FILE *f;                   /* archive to copy from */
  287. struct heads *hdr;               /* header data for file */
  288. int ver;                   /* header v